public class BinaryTest {
    public static void main(String[] args) {
        // 二进制转八进制，从低位开始，将二进制数每三位一组，转成对应的八进制数即可
        // ob(3)11(2)010(5)101 -> 0325

        // 二进制转十六进制，从低位开始，将二进制数每四位一组，转成对应的十六进制数即可
        // ob(D)1101(5)0101 -> 0xD5

        // 八进制转二进制，将八进制数每1位，转成对应的一个3位的二进制数即可
        // 十六进制转二进制，将十六进制数每1位，转成对应的一个4位的二进制数即可

        // 原码 补码 反码
        // 二进制的最高位是符号位：0表示正数，1表示负数
        // 正数的原码、补码、反码都一样
        // 负数的反码= 它的原码符合位不变，其他位取反
        // 负数的补码= 他的反码+1
        // 0的反码，补码都是0
        // java没有无符号数
        // 计算机运算时，都是以补码的方式来运算的
        // 当我们看运算结果时，要看它的原码

        System.out.println(2&3);
        // 2的原码:    00000000 00000000 00000000 00000010
        // 2的补码:    00000000 00000000 00000000 00000010
        // 3的原码:    00000000 00000000 00000000 00000011
        // 3的补码:    00000000 00000000 00000000 00000011
        // 把补码按位&:
        //            00000000 00000000 00000000 00000010
        //            00000000 00000000 00000000 00000011
        // 运算后的补码：00000000 00000000 00000000 00000010
        // 运算后的原码：00000000 00000000 00000000 00000010   正数三码合一
        // 结果就是 2

        System.out.println(~-2);
        // -2的原码:   10000000 00000000 00000000 00000010
        // -2的反码:   11111111 11111111 11111111 11111101
        // -2的补码:   11111111 11111111 11111111 11111110
        // 取反~:      00000000 00000000 00000000 00000001 运算后的补码
        // 运算后的原码: 00000000 00000000 00000000 00000001 正数三码合一
        // 结果就是1

        // 算数右移 >> : 低位溢出，符号位不变，并用符号位补溢出的高位
        int a = 1 >> 2; // 00000001 -> 00000000  本质 1/2/2=0

        //算数左移 << : 符号位不变，低位补0
        int b = 1 << 2; // 00000001 -> 00000100 本质 1*2*2=4
    }
}
